package com.tmxk.jdbc03;

/**
 * 懒汉式单例模式  -- 双重校验锁
 *  执行原理,使用延时加载机制,当调用该实例对象,则创建该实例对象
 */
public class SingletonLazy_DCL {
    // ① 私有化构造
    private SingletonLazy_DCL(){}

    // ② 创建一个私有实例对象,确保该实例的唯一性
    // volatile : 程序优化, 指令重排
    private volatile static SingletonLazy_DCL singletonLazy = null;

    // 线程A  线程B
    //③ 创建一个对外提供的获取该单例模式的公共接口(方法)
    public static SingletonLazy_DCL getInstance(){
        // 确保实例单一(唯一),如该实例对象为空,则新建; 不为空,则直接返回已有实例对象
        if ( singletonLazy == null) {
            synchronized (SingletonLazy_DCL.class){        // 线程B   singletonLazy  null
                if (singletonLazy == null) {
                    singletonLazy = new SingletonLazy_DCL();  //线程A  执行 new singletonLazy 有值
                }
            }
        }
        return singletonLazy;
    }
}
